//
//  LoopLinkList.c
//  ProjectM
//
//  Created by gaofeng on 2021/8/9.
//

#include "LoopLinkList.h"

YKList creatLoopList(void){
/**使用以下方法申明结构会遇到问题
 * 在当前函数结束，结构体变量会被回收，因为是系统分配的内存，想要长期保存需要使用malloc手动分配
 * YKNode n0,n1,n2,n3;
 */
//    推荐使用方式
    YKList L = malloc(sizeof(YKNode));
    L->data=0;
    L->next = L;
    return  L;
}
void headInsertLoop(YKList lh,int data){
    YKNode *nd = malloc(sizeof(YKNode));
    nd->data = data;
    nd->next=lh->next;
    lh->next = nd;
    lh->data++;
}
void trailInsertLoop(YKList lh,int data){
    YKNode *nd = malloc(sizeof(YKNode));
    nd->data = data;
    nd->next = lh;
    YKNode *n1 = lh;
    for (int i=0; i<lh->data; i++) {
        n1 = n1->next;
    }
    n1->next = nd;
    lh->data++;
    
}

int  deletNodeLoop(YKList L,int data){
    YKNode *pn = L;
    YKNode *cn = L->next;
    while (cn != L) {
        if (cn->data == data) {
            pn->next = cn->next;
            free(cn);
            L->data--;
            return  1;
        }
        pn = cn;
        cn = cn->next;
    }
    return  0;
}
void printLoopList(YKList L){
    YKNode *ll = L->next;
    while (ll != L) {
        printf("%d => ",ll->data);
        ll = ll->next;
    }
    printf("NULL\n");
}

int LoopLinkMain(void){

    YKList L = creatLoopList();
    headInsertLoop(L, 3);
    headInsertLoop(L, 31);
    headInsertLoop(L, 4);
    trailInsertLoop(L, 2);
    trailInsertLoop(L, 8);
    printLoopList(L);
    if (deletNodeLoop(L, 5)) {
        printf("delet success!\n");
    }else{
        printf("delet fail!\n");
    }
    printLoopList(L);

    return 0;
}
